package com.ibeeking.found.msg.rest.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ibeeking.found.common.enums.msg.MsgReceiverTypeEnum;
import com.ibeeking.found.common.utils.BlobUtils;
import com.ibeeking.found.common.utils.UserUtils;
import com.ibeeking.found.msg.rest.service.ISysMsgTemplateService;

import com.ibeeking.found.msg.service.common.bo.SysMsgTemplateBO;
import com.ibeeking.found.msg.service.common.dos.SysMsgTemplateParamDO;
import com.ibeeking.found.msg.service.common.dos.SysMsgTemplateDO;
import com.ibeeking.found.msg.service.common.param.SysMsgTemplateParam;
import com.ibeeking.found.msg.service.common.query.SysMsgTemplateQuery;
import com.ibeeking.found.msg.service.common.vo.SysMsgTemplateParamVO;
import com.ibeeking.found.msg.service.common.vo.SysMsgTemplateVO;
import com.ibeeking.found.msg.service.mapper.SysMsgTemplateMapper;
import com.ibeeking.found.msg.service.mapper.SysMsgTemplateParamMapper;
import com.ibeeking.nematos.core.utils.SpringBeanUtil;
import com.ibeeking.nematos.exception.BusinessException;
import com.ibeeking.nematos.utils.bean.BeanUtil;
import com.ibeeking.nematos.utils.data.Collections3;
import com.ibeeking.nematos.utils.data.StringUtils;
import com.ibeeking.nematos.utils.json.JsonUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * SysMsgTemplateServiceImpl
 * description 邮件模板配置服务
 *
 * @Author ibeeking
 * @Date 2020-12-09 10:54
 */
@Service
public class SysMsgTemplateServiceImpl extends ServiceImpl<SysMsgTemplateMapper, SysMsgTemplateDO> implements ISysMsgTemplateService {

    @Resource
    private SysMsgTemplateMapper sysMsgTemplateMapper;

    @Resource
    private SysMsgTemplateParamMapper sysMsgTemplateParamMapper;
    /**
     * 系统消息配置列表
     *
     * @param
     * @return
     */
    @Override
    public List<SysMsgTemplateVO> list(SysMsgTemplateQuery query) {
        List<SysMsgTemplateDO> sysMsgTemplateDOS = sysMsgTemplateMapper.selectList(new LambdaQueryWrapper<SysMsgTemplateDO>()
                .eq(query.getId() != null , SysMsgTemplateDO::getId, query.getId())
                .eq(query.getConfigId() != null , SysMsgTemplateDO::getConfigId, query.getConfigId())
                .eq(query.getReceiverType() != null , SysMsgTemplateDO::getReceiverType, query.getReceiverType())
                .eq(StringUtils.isNotEmpty(query.getTemplateCode()), SysMsgTemplateDO::getTemplateCode, query.getTemplateCode())
                .eq(StringUtils.isNotEmpty(query.getTemplateName()), SysMsgTemplateDO::getTemplateName, query.getTemplateName())
                .eq(query.getPublishStatus() != null, SysMsgTemplateDO::getPublishStatus, query.getPublishStatus())

        );
        List<SysMsgTemplateVO> sysMsgTemplateVOS = new ArrayList<>();
        if(Collections3.isNotEmpty(sysMsgTemplateDOS)){
            sysMsgTemplateVOS = sysMsgTemplateDOS.stream().map(d->{
                SysMsgTemplateVO sysMsgTemplateVO = BeanUtil.convertBean(d, SysMsgTemplateVO.class);
                Object obj = d.getTemplateContent();
                if(obj != null){
                    sysMsgTemplateVO.setTemplateContent(new String((byte[]) obj, StandardCharsets.UTF_8));
                }
                sysMsgTemplateVO.setReceiverTypeDesc(MsgReceiverTypeEnum.getNameByCode(d.getReceiverType()));
                return sysMsgTemplateVO;
            }).collect(Collectors.toList());
        }
        return sysMsgTemplateVOS;
    }

    /**
     * 邮件服务器列表
     *
     * @param
     * @return
     */
    @Override
    public List<SysMsgTemplateVO> listAll() {
        List<SysMsgTemplateDO> sysMsgTemplateDOS = sysMsgTemplateMapper.selectList(new LambdaQueryWrapper<SysMsgTemplateDO>());
        List<SysMsgTemplateVO> sysMsgTemplateVOS = new ArrayList<>();
        if(Collections3.isNotEmpty(sysMsgTemplateDOS)){
            sysMsgTemplateVOS = sysMsgTemplateDOS.stream().map(d->{
                SysMsgTemplateVO sysMsgTemplateVO = BeanUtil.convertBean(d, SysMsgTemplateVO.class);
                Object obj = d.getTemplateContent();
                if(obj != null){
                    sysMsgTemplateVO.setTemplateContent(new String((byte[]) obj, StandardCharsets.UTF_8));
                }
                sysMsgTemplateVO.setReceiverTypeDesc(MsgReceiverTypeEnum.getNameByCode(d.getReceiverType()));
                return sysMsgTemplateVO;
            }).collect(Collectors.toList());
        }
        return sysMsgTemplateVOS;
    }
    /**
     * 系统消息配置列表
     *
     * @param
     * @return
     */
    @Override
    public List<SysMsgTemplateVO> listByConfigId(Long configId) {
        SysMsgTemplateQuery query = new SysMsgTemplateQuery();
        query.setConfigId(configId);
        return getBean().list(query);
    }
    /**
     * 邮件参数列表
     *
     * @param
     * @return
     */
    @Override
    public List<SysMsgTemplateParamVO> listSysMsgTemplateParam(Long templateId) {
        List<SysMsgTemplateParamDO> sysMsgTemplateParamDOS = sysMsgTemplateParamMapper.selectList(new LambdaQueryWrapper<SysMsgTemplateParamDO>()
                .eq(SysMsgTemplateParamDO::getTemplateId, templateId)
        );
        List<SysMsgTemplateParamVO> sysMsgTemplateParamVOS = JsonUtils.jsonToList(sysMsgTemplateParamDOS, SysMsgTemplateParamVO.class);
        return sysMsgTemplateParamVOS;
    }

    /***
     * 修改模板
     */
    @Override
    public Boolean modify(SysMsgTemplateParam param) {
        Long userId = UserUtils.getUserId();

        String templateContent = param.getTemplateContent();
        Blob blobTemplateContent = BlobUtils.string2blob(templateContent);
        SysMsgTemplateDO sysMsgTemplateDO = BeanUtil.convertBean(param, SysMsgTemplateDO.class);
        sysMsgTemplateDO.setModifyBy(userId);
        sysMsgTemplateDO.setModifyTime(LocalDateTime.now());
        sysMsgTemplateDO.setTemplateContent(blobTemplateContent);

        return sysMsgTemplateMapper.updateById(sysMsgTemplateDO) > 0;
    }

    @Override
    public Boolean changePublishStatus(Long id, Integer status) {
        Long userId = UserUtils.getUserId();
        SysMsgTemplateDO sysMsgTemplateDO =  sysMsgTemplateMapper.selectById(id);
        if(sysMsgTemplateDO == null){
            throw new BusinessException("记录不存在");
        }
        sysMsgTemplateDO.setPublishStatus(status);
        sysMsgTemplateDO.setModifyBy(userId);
        sysMsgTemplateDO.setModifyTime(LocalDateTime.now());
        return sysMsgTemplateMapper.updateById(sysMsgTemplateDO) > 0;
    }
    /***
     * 通过id查询模板
     */
    @Override
    public SysMsgTemplateVO view(Long id) {
        SysMsgTemplateDO sysMsgTemplateDO = sysMsgTemplateMapper.selectById(id);
        if(sysMsgTemplateDO == null){
            throw new BusinessException("查询数据不存在");
        }
        SysMsgTemplateVO sysMsgTemplateVO = BeanUtil.convertBean(sysMsgTemplateDO, SysMsgTemplateVO.class);
        Object obj = sysMsgTemplateDO.getTemplateContent();
        if(obj != null) {
            sysMsgTemplateVO.setTemplateContent(new String((byte[]) sysMsgTemplateDO.getTemplateContent(), StandardCharsets.UTF_8));
        }
        sysMsgTemplateVO.setReceiverTypeDesc(MsgReceiverTypeEnum.getNameByCode(sysMsgTemplateVO.getReceiverType()));
        return sysMsgTemplateVO;
    }
    /***
     * 通过id查询模板
     */
    @Override
    public SysMsgTemplateVO viewByCode(String code) {
        SysMsgTemplateDO sysMsgTemplateDO = sysMsgTemplateMapper.selectOne(new LambdaQueryWrapper<SysMsgTemplateDO>()
                .eq(SysMsgTemplateDO::getTemplateCode, code)
        );
        if(sysMsgTemplateDO == null){
            throw new BusinessException("查询数据不存在");
        }
        SysMsgTemplateVO sysMsgTemplateVO = BeanUtil.convertBean(sysMsgTemplateDO, SysMsgTemplateVO.class);
        Object obj = sysMsgTemplateDO.getTemplateContent();
        if(obj != null) {
            sysMsgTemplateVO.setTemplateContent(new String((byte[]) sysMsgTemplateDO.getTemplateContent(), StandardCharsets.UTF_8));
        }
        sysMsgTemplateVO.setReceiverTypeDesc(MsgReceiverTypeEnum.getNameByCode(sysMsgTemplateVO.getReceiverType()));
        return sysMsgTemplateVO;
    }
    /***
     * 通过id查询模板
     */
    @Override
    public SysMsgTemplateBO queryTemplateById(Long id) {
        SysMsgTemplateDO sysMsgTemplateDO = sysMsgTemplateMapper.selectById(id);
        if(sysMsgTemplateDO == null){
            throw new BusinessException("查询数据不存在");
        }
        SysMsgTemplateBO sysMsgTemplateBO = BeanUtil.convertBean(sysMsgTemplateDO, SysMsgTemplateBO.class);
        Object obj = sysMsgTemplateDO.getTemplateContent();
        if(obj != null) {
            sysMsgTemplateBO.setTemplateContent(new String((byte[]) sysMsgTemplateDO.getTemplateContent(), StandardCharsets.UTF_8));
        }

        return sysMsgTemplateBO;
    }
    /***
     * 通过code查询模板
     */
    @Override
    public SysMsgTemplateBO queryTemplateByCode(String code) {
        SysMsgTemplateDO sysMsgTemplateDO = sysMsgTemplateMapper.selectOne(new LambdaQueryWrapper<SysMsgTemplateDO>()
                .eq(SysMsgTemplateDO::getTemplateCode, code));
        if(sysMsgTemplateDO == null){
            throw new BusinessException("查询数据不存在");
        }
        SysMsgTemplateBO sysMsgTemplateBO = BeanUtil.convertBean(sysMsgTemplateDO, SysMsgTemplateBO.class);
        Object obj = sysMsgTemplateDO.getTemplateContent();
        if(obj != null) {
            sysMsgTemplateBO.setTemplateContent(new String((byte[]) sysMsgTemplateDO.getTemplateContent(), StandardCharsets.UTF_8));
        }
        return sysMsgTemplateBO;
    }
    private SysMsgTemplateServiceImpl getBean() {
        return SpringBeanUtil.getBean(SysMsgTemplateServiceImpl.class);
    }
}
